YubiKey に GPG 鍵を入れる
そこら中に同様のドキュメントがあるけど、あると便利な自分用備忘録。
GPG 鍵の設定については OpenPGP 鍵の生成と運用について を参照。
マシンの設定
code:shell
sudo pacman -S pcsclite ccid
sudo systemctl start pcscd
sudo systemctl enable pcscd
YubiKey の設定
USB スロットに YubiKey を挿入して様子を確認。
code:shell
$ gpg --card-status
Reader ...........: Yubico YubiKey OTP FIDO CCID 00 00
:
:
https://github.com/drduh/YubiKey-Guide#yubikey がこれやれって言ってる。
code:shell
$ echo "SCD RANDOM 512" | gpg-connect-agent | sudo tee /dev/random | hexdump -C
YubiKey のコンフィグ開始。
code:shell
$ gpg --card-edit
まずは PIN の設定を行うため KDF を有効にする。
code:shell
gpg/card> admin
gpg/card> kdf-setup
ここで PIN の入力ポップアップが出るので、デフォルトの Admin PIN である 12345678 を入れる。
Admin PIN を設定する
code:shell
gpg/card> passwd
Your selection? 3
続いて Admin じゃない PIN。こちらはデフォルトが 123456 である。
code:shell
gpg/card> passwd
Your selection? 1
その後 PIN の設定を抜ける。
code:shell
Your selection? Q
鍵を YubiKey に入れる
続いて key を YubiKey に移動させる。移動、そう、コピーではないのだ。keytocard コマンドを使うのだがこれにより実行した端末から鍵が消えるので注意が必要である。なのでもし複数の YubiKey に鍵を保存したい場合は先にバックアップをとっておき、移動の度に鍵をバックアップから復元する必要がある…のだが、これがまた面倒である。手順は後述。
(思想としては、重要なものなので物理的に一箇所にしか存在しない前提にしている、ということなのだろうか?)
対象のキーの ID をまずは確認しよう。
code:shell
$ gpg -K
そして
code:shell
$ gpg --edit-key $KEYID
これで $KEYIDの master key と subkey の一覧が出てくるので、その中から移動対象を選ぶ。master key を 0 として、subkey には 1, 2, ... とインデックスが振られているので、例えば 1 を移動させたければ以下で選択できる。
code:shell
gpg> key 1
選択状態にあるものは * が表示されて ssb* のようになる。トグル方式なのでやり直しが可能であり、複数選択も可能であるが、keytocardするためには 1 つだけしか選んではいけない。
ここで選択した鍵が複数の役割を持つ、例えば署名と認証の両方に使えるものであれば以下のようになる。
code:shell
gpg> keytocard
Please select where to store the key:
(1) Signature key
(3) Authentication key
Your selection?
どちらか一方をここでは選ぶわけだが、両方対応したい場合は 2 度この作業をすればよい…と思う。
すると master key のパスフレーズ、admin PIN の順番で質問してくるのでそれぞれ入力する。
必要な subkey をすべて keytocard したら保存する。
code:shell
gpg> save
YubiKey に移動できたかどうかの確認は以下で行う。
code:shell
$ gpg -K
移動していない subkey は ssb 移動したものは ssb> と表示される。
同じ鍵の入った YubiKey を複製する
物理的に適切な管理をする必要があるが、紛失や破損に備える場合には検討する。YubiKey 自体のセットアップは同じである。
面倒な話なのだが、GPG は内部的に「この秘密鍵は smart card に移動しましたぜ」というフラグを永続化していて、これを消し去らない限りは新たな YubiKey に鍵を入れることはできない。
で、対処方法だが、愚直に全消しして改めて入れることとなる。
まずは削除から。
code:shell
$ gpg --delete-secret-and-public-key $KEYID
$ cd ~/.gnupg/private-keys-v1.d
$ ls
で、表示された秘密鍵は消す。
続いて再投入。当然バックアップは取ってあるよな?という前提で以下を行う。master key の公開鍵、ならびに subkey に対して以下のようなコマンドを打つ。
code:shell
$ gpg --import /path/to/key.gpg
ここまできたら、YubiKey に同様の手順で秘密鍵を入れることができる。
ここからもう 1 つ重要な話を。
GPG は最後に keytocard した YubiKey、というか smart card のシリアルナンバーを記憶しており、それが食い違うとエラーになる。
なので利用する YubiKey を変更する場合は、同じ鍵が保存されていようとも以下のコマンドを打ってシリアル番号を書き換えてやる必要がある。
code:shell
$ gpg-connect-agent "scd serialno" "learn --force" /bye
暗号化は注意が必要
こんなエラーが出る場合がある。
code:text
gpg: XXXXXXXXXXXXXXXXXXX There is no assurance this key belongs to the named user
gpg: stdin: encryption failed: Unusable public key
この場合は鍵を改めて信頼する必要がある。
gpg --edit-key $kei-id で変更を開始し、先程のように key $index で暗号化鍵を選択し、そこで trust コマンドを打つ。選択肢が出てくるので 5 = I trust ultimately を選ぶ。うん、自分の鍵だしな。
#Linux #YubiKey